#include "../includes/pagoracer.h"


/* Altera o vetor de pontos a serem desenhados no OpenGL */
void ModificaDesenho() {
  int i;

  for (i=0;i<FIM_DESENHADO;i++) {
    PontosDePista[i].x = PontosDePista[i+NUM_PASSOS].x;
    PontosDePista[i].y = PontosDePista[i+NUM_PASSOS].y - DIST_PONTOS_ESPARSOS;
    PontosDePista[i].z = PontosDePista[i+NUM_PASSOS].z;
  };

  PontosDePista[FIM_DESENHADO].x = PontosEsparsos[NUM_DESENHADOS].x;
  PontosDePista[FIM_DESENHADO].y = PontosEsparsos[NUM_DESENHADOS].y;
  PontosDePista[FIM_DESENHADO].z = PontosEsparsos[NUM_DESENHADOS].z;
  for (i=1;i<NUM_PASSOS;i++) {
    PontosDePista[FIM_DESENHADO+i].x = CalculaBezier((1.0/((GLfloat) NUM_PASSOS))*((GLfloat) i),
						     PontosEsparsos[NUM_DESENHADOS].x,
						     PontosDeMeio[NUM_DESENHADOS].x,
						     PontosEsparsos[NUM_DESENHADOS+1].x);
    PontosDePista[FIM_DESENHADO+i].y = CalculaBezier((1.0/((GLfloat) NUM_PASSOS))*((GLfloat) i),
						     PontosEsparsos[NUM_DESENHADOS].y,
						     PontosDeMeio[NUM_DESENHADOS].y,
						     PontosEsparsos[NUM_DESENHADOS+1].y);
    PontosDePista[FIM_DESENHADO+i].z = Z;
  };
};

void AchaLimites (int estado_anterior, GLfloat x_atual, 
		  GLfloat * inferior, GLfloat * superior) {

  if (estado_anterior == DIFF_RETA) {
    if (x_atual >= X_MAXIMO) {
      *inferior = (GLfloat) INICIO_ESQ;
      *superior = (GLfloat) FIM_RETA;
    } else if (x_atual <= -X_MAXIMO) {
      *inferior = (GLfloat) INICIO_RETA;
      *superior = (GLfloat) FIM_DIR;
    } else {
      *inferior = (GLfloat) INICIO_ESQ;
      *superior = (GLfloat) FIM_DIR;
    };
  } else if (estado_anterior == DIFF_ESQUERDA) {
    if (x_atual <= -X_MAXIMO) {
      *inferior = (GLfloat) INICIO_RETA;
      *superior = (GLfloat) FIM_RETA;
    } else {
      *inferior = (GLfloat) INICIO_ESQ;
      *superior  = (GLfloat) FIM_RETA;
    };
  } else {
    if (x_atual >= X_MAXIMO) {
      *inferior = (GLfloat) INICIO_RETA;
      *superior = (GLfloat) FIM_RETA;
    } else {
      *inferior = (GLfloat) INICIO_RETA;
      *superior = (GLfloat) FIM_DIR;
    };
  };
  
};

/* Altera o vetor de pontos a serem desenhados no OpenGL */
void RedefinePista() {
  int random_generated;
  int i;
  time_t tempo;
  GLfloat b;
  GLfloat inicio,fim;
  if (ProfundidadePista <= -(DIST_PONTOS_ESPARSOS)) {
    for (i=0;i<(NUM_DESENHADOS + 1);i++) {
      PontosEsparsos[i].x = PontosEsparsos[i+1].x;
      PontosEsparsos[i].y = PontosEsparsos[i+1].y - DIST_PONTOS_ESPARSOS;
      PontosEsparsos[i].z = Z;
      PontosDeMeio[i].x = PontosDeMeio[i+1].x;
      PontosDeMeio[i].y = PontosDeMeio[i+1].y - DIST_PONTOS_ESPARSOS;
      PontosDeMeio[i].z = Z;
    };
  
    AchaLimites(DiffFinal,PontosEsparsos[NUM_DESENHADOS].x,&inicio,&fim);

    srandom(time(&tempo));
    random_generated = random();
    b = inicio + (((fim-inicio)*(((GLfloat) random_generated))) / ((GLfloat) (RAND_MAX)));
    random_generated = (int) b;

    /* Acha pontos X, Y e Z novos */
    if (random_generated < FIM_ESQ) {
      DiffFinal = DIFF_ESQUERDA;
      PontosEsparsos[NUM_DESENHADOS+1].x = PontosEsparsos[NUM_DESENHADOS].x - TAMANHO_CURVA;
    } else if (random_generated < FIM_RETA) {
      DiffFinal = DIFF_RETA;
      PontosEsparsos[NUM_DESENHADOS+1].x = PontosEsparsos[NUM_DESENHADOS].x;
    } else {
      DiffFinal = DIFF_DIREITA;
      PontosEsparsos[NUM_DESENHADOS+1].x = PontosEsparsos[NUM_DESENHADOS].x + TAMANHO_CURVA;
    };
    PontosEsparsos[NUM_DESENHADOS+1].y = PontosEsparsos[NUM_DESENHADOS].y + DIST_PONTOS_ESPARSOS;
    PontosEsparsos[NUM_DESENHADOS+1].z = Z;

    /* Acha meios X, Y e Z novos */
    
    if ((PontosEsparsos[NUM_DESENHADOS+1].x - PontosDeMeio[NUM_DESENHADOS].x) > (TAMANHO_CURVA-1.0)) {
      PontosDeMeio[NUM_DESENHADOS+1].x = PontosEsparsos[NUM_DESENHADOS+1].x + TAMANHO_CURVA;
    } else if ((PontosEsparsos[NUM_DESENHADOS+1].x - PontosDeMeio[NUM_DESENHADOS+1].x) < -(TAMANHO_CURVA-1.0)) {
      PontosDeMeio[NUM_DESENHADOS+1].x = PontosEsparsos[NUM_DESENHADOS+1].x - TAMANHO_CURVA;
    } else {
      PontosDeMeio[NUM_DESENHADOS+1].x = PontosEsparsos[NUM_DESENHADOS+1].x;
    };
    
    //    PontosDeMeio[NUM_DESENHADOS+1].x = (2*PontosEsparsos[NUM_DESENHADOS+1].x) - PontosDeMeio[NUM_DESENHADOS].x;
    PontosDeMeio[NUM_DESENHADOS+1].y = PontosEsparsos[NUM_DESENHADOS+1].y + DIST_ESPAR_MEIO_Y;
    PontosDeMeio[NUM_DESENHADOS+1].z = Z;

    ModificaDesenho();

    ProfundidadePista += DIST_PONTOS_ESPARSOS;
  };
};
